package main // main 包可以编译成二进制文件可以执行的文件
import (
	"encoding/json"
	"fmt"
)

// 结构体字段的可见性与序列化
// 如果一个Go语言包中定义的标识符是首字母大写的，那么就是对外可见的。
// 结构体中字段大写表示可以公开访问，小写表示私有，仅在定义当前结构体的包中可访问

type student struct {
	ID   int
	Name string
}

type class struct {
	Title    string `json:"title""` // 这样运行之后就回变小写，必须按照格式来写
	Students []student
}

// 创建构造函数
func newStudent(id int, name string) student {
	return student{
		ID:   id,
		Name: name,
	}
}
func main() {
	c1 := class{
		Title:    "火箭101",
		Students: make([]student, 0, 20),
	}
	// 往班级c1中添加学生
	for i := 0; i < 10; i++ {
		// 添加10个学生
		tmpStu := newStudent(i, fmt.Sprintf("stu%02d", i))
		c1.Students = append(c1.Students, tmpStu)
	}
	fmt.Printf("%#v\n", c1)

	// json 序列化：Go语言中的数据 —> json格式的字符串
	data, err := json.Marshal(c1)
	if err != nil {
		fmt.Println("json marshal failed,err", err)
		return
	}
	fmt.Printf("%T\n", data)
	fmt.Printf("%s\n", data)

	// json 反序列化:json格式的字符串 ——> Go语言的数据
	jsonStr := `{"Title":"火箭101","Students":[{"ID":0,"Name":"小王子"},{"ID":1,"Name":"娜扎"},{"ID":2,"Name":"stu02"}]}`
	var c2 class
	err = json.Unmarshal([]byte(jsonStr), &c2)
	if err != nil {
		fmt.Println("json unmarshal failed ,err", err)
		return
	}
	fmt.Printf("%v\n", c2)
}
